package com.arpa.wms.service;

import com.arpa.core.web.Result;
import com.arpa.wms.domain.dto.LocationDTO;
import com.arpa.wms.domain.dto.LocationExcelDTO;
import com.arpa.wms.domain.entity.Location;
import com.arpa.wms.domain.entity.WarehouseSpace;
import com.arpa.wms.domain.enums.TempLocationTypeEnum;
import com.arpa.wms.domain.vo.BatchRuleVO;
import com.arpa.wms.domain.vo.LocationVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;

/**
 * <p>
 * 库位 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-08-03
 */
public interface ILocationService extends IService<Location> {

    /**
     * 保存
     * @param entity
     * @return
     */
    @Override
    boolean save(Location entity);

    /**
     * 根据code更新实体
     * @param entity
     * @return
     */
    int updateByCode(Location entity);

    /**
     * 通过code获取库位信息
     * @param code
     * @return
     */
    Location getByCode(String code);


    /**
     * 通过code获取库位详细信息
     * @param code
     * @return
     */
    LocationVO getLocation(String code);

    /**
     * 查询列表
     * @param locationDTO
     * @return
     */
    List<LocationVO> queryList(LocationDTO locationDTO);

    /**
     * 通过承载类型查询库位信息
     * @param list
     * @return
     */
    List<LocationVO> queryByBearType(List<String> list);

    /**
     * 查询合计,包含总数
     * @param locationDTO
     * @return
     */
    LocationVO queryListSum(LocationDTO locationDTO);

    /**
     * 删除
     * @param code
     */
    Result deleteByCode(List<String> code);

    /**
     * 启用
     * @param code
     * @return
     */
    int activeStatus(List<String> code);

     /**
      *  @author: Allen chen
      *  @Date: 2020/10/15 15:32
      *  @Description: 根据仓库codes批量启用临时库位
      */
    int changeStatusByWarehouseCodes(List<String> warehouseCodes,String status,String deleteFlag);

    /**
     * 停用
     * @param code
     * @return
     */
    Map<String,Object> unactiveStatus(List<String> code);

    /**
     * 未使用的库位
     * @param codes
     * @return
     */
    List<String> emptyLocation(List<String> codes);

    /**
     * 库位停用
     * @param code
     * @return
     */
    Future<Boolean> unactive(String code);


    /**
     * 校验库位信息
     * @param entity
     * @return
     */
    Result validateLocation(Location entity);

    /**
     * 前台页面库位下拉数据
     * @param warehouseCode
     * @param spaceCode
     * @param locationName
     * @return
     */
    List<LocationVO> findLocationLimit(String warehouseCode, String spaceCode, String locationName,String pageNum,String pageSize);


    /**
     * 前台页面库位下拉数据
     * @param warehouseCode
     * @param spaceCode
     * @param locationName
     * @return
     */
    List<LocationVO> findLocation(String warehouseCode, String spaceCode, String locationName);

    /**
     *  @author: Allen chen
     *  @Date: 2020/10/10 9:14
     *  @Description: 根据code批量查询
     */
    List<LocationVO> queryByCodes(List<String> codes);

    Map<String,Object> batchdel(List<String> codes);

    /**
     * 创建临时库位
     * @param space
     * @return
     */
    int createTempLocation(WarehouseSpace space);

    /**
     * 更新库位动碰次数
     * @param locationCode 库位编码
     * @param addActionNum 增加的动碰次数
     * @return
     */
    boolean updateActionNum(String locationCode, int addActionNum);

    /**
     * 前台页面库位下拉数据（包含临时库位）
     * @param warehouseCode
     * @param spaceCode
     * @param locationName
     * @return
     */
    List<LocationVO> findAllLocation(String warehouseCode, String spaceCode, String locationName);

    /**
     * 获取库位导入操作预览数据
     * @param list
     * @return
     */
    List<LocationVO> importPreviewList(List<LocationExcelDTO> list);

    /**
     * 根据导入码导入库位信息
     * @param importCode
     * @return
     */
    Result importLocation(String importCode);

    /**
     * 获取临时库位
     * @param warehouseCode  仓库标识
     * @param tempLocationType 临时库位类型
     * @return
     */
    Location getTempLocation(String warehouseCode, TempLocationTypeEnum tempLocationType);

    /**
     * 获取所有库位
     * 根据实际情况增加
     * @param map 查询条件
     * @return
     */
    List<LocationVO> getAllByMap(Map<String,Object> map);


    LocationVO queryListSumLocation(String warehouseCode, String spaceCode, String locationName, String pageNum, String pageSize);
}
